package com.itheima.d5_resource;

import java.io.*;

/**
 * 目标：掌握释放资源的方式。
 *  把案例CopyTest5拿过来改的
 */
public class Test2 {
    public static void main(String[] args)  {
        //要进行try catch就不要抛出异常了，全体代码选中，按住：ctrl+alt+t键

        //以下的os文件字节输出流和is文件字节输入流都只能在try的{}范围内访问，所以把两个变量在外面先初始化一下
        InputStream is = null;
        OutputStream os = null;

        try {
            System.out.println(10 / 0);

            // 1、创建一个字节输入流管道与源文件接通
            is = new FileInputStream("Day08File-Io-App\\src\\itheima03.txt");
            // 2、创建一个字节输出流管道与目标文件接通。
            os = new FileOutputStream("Day08File-Io-App\\src\\itheima03copy.txt");

            System.out.println(10 / 0);

            // 3、创建一个字节数组，负责转移字节数据。
            byte[] buffer = new byte[1024]; // 1KB.
            // 4、从字节输入流中读取字节数据，写出去到字节输出流中。读多少写出去多少。
            int len; // 记住每次读取了多少个字节。
            while ((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
            System.out.println("复制完成！！");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 释放资源的操作
            //问题1.系统担心在try模块已经把流关闭了，所以会报异常
            //问题2.在创建流之前，也就是is = new FileInputStream之前出现的异常，那么就会直接跳到catch这里，最后执行finally代码块
            //      就会出现，这两个流对象还没有做好，还是null，再去调用close方法，就会出现空指针异常
            //解决方法： 所以is和os都需要经过非空判断和try catch
            try {
                if(os != null) os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if(is != null) is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }




    }
}
